home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bixdos.arc / STACK < prev   
Text File  |  1986-11-24  |  9KB  |  153 lines

  1. TITLE: Some inside scoop on a DOS 3.2 "bug" relating to interrupt stack space
  2.  
  3.  
  4. Date: Fri 16 May 86 13:21:00-PDT
  5. From: Ted Shapin <BEC.SHAPIN@USC-ECL.ARPA>
  6. Subject: DOS 3.2 Fatal Internal Stack Failure
  7. To: info-ibmpc@USC-ISIB.ARPA
  8.  
  9.  
  10.  TITLE:    04/21/86 PC DOS :   PC-FLASH - DOS 3.2 STACK MANAGEMENT AS
  11.                     RELATED TO HARDWARE INTERRUPTS/ PAUSE KEY NOTES
  12.  
  13.  $SOURCE: ITEM 959MG  FROM EQUAL SYSTEM HONCDPD   3
  14.  SOURCE MATERIAL DATED:  APR86
  15.  
  16.  
  17. Due to the confusion surrounding DOS 3.2 and its interrupt processing and a
  18. known problem with the enhanced keyboard's pause key, I will try to set the
  19. record straight.
  20.  
  21. PAUSE KEY
  22. Repeated use of the pause key while scrolling is already paused, will cause
  23. repeated interrupts, within the same interrupt handler.  This MAY lead to the
  24. exhaustion of DOS's stack pool leading to a DOS INTERNAL STACK ERROR.  This
  25. exposure was alluded to in the announcement letter under the Technical
  26. Assistance paragraph.  The supplemental information mentioned, is a software
  27. fix for the problem, which is available.  To circumvent the problem without the
  28. fix, the user need only hit the pause key once to pause scrolling, and any
  29. other key to resume scrolling since the PAUSE key is not a toggle key.
  30.  
  31. DOS 3.2 has been enhanced to provide stack management for hardware interrupts,
  32. and allow the user to tune the system using the STACKS parameter of CONFIG.SYS.
  33. This enhancement allows for the use of available applications in an environment
  34. which is interrupt intensive, i.e., high speed communications etc., at the
  35. expense of loosing memory to a stack pool.  Since most environments do not need
  36. more than 9 stacks, that number is the default and acceptable to most
  37. environments.
  38.  
  39. The following provides the details of DOS 3.2's stack management enhancement.
  40. Only the detail necessary to explain DOS Stack Management as it relates to
  41. hardware interrupts has been provided.
  42.  
  43. DOS 3.2 Stack Management
  44.  
  45. This version of DOS has implemented a technique known as stack swapping when
  46. handling hardware interrupts.  When a hardware interrupt is generated, DOS gets
  47. control and swaps the stack that had been used for a clean DOS stack.  After
  48. swapping stacks DOS passes control to the interrupt handler associated with the
  49. hardware interrupt.  Upon return from the interrupt handler, DOS restores the
  50. old stack and adds the stack to its pool of stacks.
  51.  
  52. This implementation was necessary to allow existing applications to run in an
  53. interrupt intensive environment.  Prior to stack swapping, it was up to an
  54. application to maintain a large enough stack so that interrupt processing
  55. routines could use its stack.  Hardware interrupts are unscheduled events and
  56. can occur at any time.  They may occur when executing a DOS function, an
  57. application or most importantly when another interrupt is being processed.  The
  58. last case, "when another interrupt is being processed" has an exposure.
  59.  
  60. An explanation of the exposure necessitates the understanding of how interrupts
  61. and stacks relate to one another.  We'll keep it as simple as we can.  The
  62. stack is an area of memory which can be thought of as a stack of boxes.  These
  63. boxes are used to temporarily store information.  In the case of interrupt
  64. processing, this information is the register values saved at the
  65. acknowledgement of an interrupt.  The interrupt handler saves these register
  66. values so they are preserved when the handler uses the registers for its own
  67. work.  The registers belong to the application etc.  which was running when the
  68. interrupt occurred.  The interrupt handler must restore these registers when it
  69. prepares to return to the interrupted application so that application can
  70. continue processing where it was interrupted.  Let's call the saving and
  71. restoring of these registers the preservation and restoration of the
  72. interrupted environment.  Do not confuse the DOS ENVIRONMENT STRINGS, with
  73. environment as discussed in this article.
  74.  
  75. Keep in mind that this environment could refer to DOS, the application or an
  76. interrupt handler, i.e., any code being executed when a hardware interrupt
  77. occurs.  So, the register values are put in the little boxes by the interrupt
  78. handler.  They are filled sequentially starting at the bottom of the stack and
  79. working up.  The pointer to the "next box" is maintained by the microprocessor.
  80. When the interrupted environment is restored the data is taken from the boxes
  81. and placed back into the registers.  The stack is allocated and defined by the
  82. application which is running.
  83.  
  84. Before the days of high speed communications (Token Ring) and multitasking the
  85. users stack was generally adequate in size to handle normal hardware interrupt
  86. processing.  Imagine, if you will, the problem encountered if an application is
  87. interrupted and the environment saved, then the interrupt handler is
  88. interrupted and the environment saved and on and on.  This could represent an
  89. interrupt intensive environment.
  90.  
  91. Note that interrupts are occurring so fast that an interrupt handler never gets
  92. a chance to restore the environment and thus free up some boxes in the stack.
  93. If the stack is not large enough to accommodate all these saved environments
  94. then boxes are still filled even though they aren't within the allocated stack.
  95. When the stack is exceeded as discussed, an overlay condition exists where the
  96. environment was saved outside of the defined stack area.  This leads to
  97. unexplained errors such as no response from the keyboard (hang), or divide
  98. overflow or divide by zero etc, because executable instructions or data was
  99. overlayed.
  100.  
  101. Since the application defines and owns the stack, and the PC, in an
  102. increasingly number of cases, is being subject to an abundance of interrupts,
  103. DOS 3.2 was designed to utilize stack swapping.  With DOS 3.2 the exposure of
  104. interrupting an interrupt handler and over utilizing the application's stack
  105. has disappeared since DOS manages the stacks used by the hardware interrupt
  106. routines.  Now when an interrupt occurs the applications stack is saved and DOS
  107. passes a free DOS stack, from its pool of stacks, to the interrupt handler.
  108. This stack is used the same way the original stack was used, to save and
  109. restore the environment.  Now when a second interrupt occurs while processing
  110. the first interrupt, DOS uses another free stack, and so forth and so on until
  111. all the environments are restored, and all the stacks swap back until, finally,
  112. the application gets its stack back and continues processing.
  113.  
  114. There aren't an infinite number of DOS stacks, so it is possible for DOS to
  115. find itself in a position that he cannot swap to a free stack because they are
  116. all being used.  This will result in an error message with DOS 3.2 which reads:
  117.  
  118.            FATAL:INTERNAL STACK FAILURE, SYSTEM HALTED
  119. In the past, the user could not be notified that they had a stack problem
  120. (overlay), except by hangs and unrelated error messages.  With DOS 3.2, a
  121. notice is provided prior to locking up the machine.  There is no way to recover
  122. from the error without loosing data integrity so the machine is put into a
  123. never-ending loop by DOS.  While data may be lost, the error is an indication
  124. that the number of stacks used by DOS should be increased, as your
  125. configuration is exceeding the available stack space via hardware interrupts.
  126.  
  127. A new CONFIG.SYS parameter allows the user to redefine the number of stacks to
  128. be allocated and used by DOS to prevent future errors and the subsequent lose
  129. of data.  This new parameter is the STACKS parameter and is located in the DOS
  130. users manual on page B-2.  If you are worried about experiencing this problem
  131. you could set the STACKS parameter to its maximum and have an excellent chance
  132. of never experiencing the error.  However, nothing is free, and you would have
  133. lost 32k of memory to the DOS stacks.  Since DOS is growing from release to
  134. release it is better to allow the user to set the amount of memory he can
  135. afford to utilize for stack space, rather than add another 32k to DOS.  Keep in
  136. mind that only users in an interrupt intensive environment will need to alter
  137. the default STACKS parameter.
  138.  
  139. For those of you unfamiliar with PC interrupts, the following is a partial list
  140. of some of the more popular adapters and PC functions using interrupts:
  141.  
  142.            TOD CLOCK       (religiously 1 interrupt every 18.6 ms)
  143.            KEYBOARD        (pressing and releasing key)
  144.            3278/79 ADAPTER
  145.            ASYNCH ADAPTER
  146.            BSC ADAPTER
  147.            SDLC ADAPTER
  148.            NETWORK ADAPTER
  149.            TOKEN RING ADAPTER
  150.            DISKETTE DRIVE
  151.            FIXED DISK DRIVE
  152.            DACQ ADAPTER
  153.